package com.zh.blog.controller.category;

import com.zh.blog.annotation.OptLog;
import com.zh.blog.common.api.Result;
import com.zh.blog.dto.CategoryBackDto;
import com.zh.blog.dto.CategoryDto;
import com.zh.blog.dto.CategoryOptionDto;
import com.zh.blog.service.CategoryService;
import com.zh.blog.vo.CategoryVO;
import com.zh.blog.vo.ConditionVO;
import com.zh.blog.vo.PageResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;

import java.util.List;

import static com.zh.blog.constant.OptTypeConst.REMOVE;
import static com.zh.blog.constant.OptTypeConst.SAVE_OR_UPDATE;

/**
 * 分类控制器
 * @author ZhengHao
 * Created At 2022/8/3.
 **/
@Api(tags = "分类模块")
@RestController
public class CategoryController {
    @Autowired
    private CategoryService categoryService;

    /**
     * 查看分类列表
     * @return 分类列表
     */
    @ApiOperation(value = "查看分类列表")
    @GetMapping("/categories")
    public Result<PageResult<CategoryDto>> listCategories(){
        return Result.ok(categoryService.listCategories());
    }

    /**
     * 查看后台分类列表
     * @param conditionVO 条件
     * @return 分类列表
     */
    @ApiOperation(value = "查看后台分类列表")
    @GetMapping("/admin/categories")
    public Result<PageResult<CategoryBackDto>> listBackCategories(ConditionVO conditionVO){
        return Result.ok(categoryService.listBackCategories(conditionVO));
    }

    /**
     * 搜索文章分类
     * @param conditionVO 条件
     * @return 分类列表
     */
    @ApiOperation(value = "搜索文章分类")
    @GetMapping("/admin/categories/search")
    public Result<List<CategoryOptionDto>> listCategoriesBySearch(ConditionVO conditionVO){
        return Result.ok(categoryService.listCategoriesBySearch(conditionVO));
    }

    /**
     * 添加或者修改分类
     * @param categoryVO 分类信息
     * @return
     */
    @OptLog(optType = SAVE_OR_UPDATE)
    @ApiOperation(value = "添加或者修改分类")
    @PostMapping("/admin/categories")
    public Result<?> saveOrUpdateCategory(@Valid @RequestBody CategoryVO categoryVO){
        categoryService.saveOrUpdateCategory(categoryVO);
        return Result.ok();
    }

    /**
     * 删除分类
     * @param categoryIdList 分类ID列表
     * @return
     */
    @OptLog(optType = REMOVE)
    @ApiOperation(value = "删除分类")
    @DeleteMapping("/admin/categories")
    public Result<?> deleteCategories(@RequestBody List<Integer> categoryIdList) {
        categoryService.deleteCategories(categoryIdList);
        return Result.ok();
    }
}